import os
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment
from openpyxl.utils.dataframe import dataframe_to_rows

# 设置当前目录
current_dir = os.path.dirname(os.path.abspath(__file__))

# 修复：保留样式添加新列的函数
def add_column_with_style(input_file, output_file, new_column_name, new_column_data):
    """
    读取Excel文件，添加一列并保留原有样式
    
    参数:
    input_file (str): 输入Excel文件路径
    output_file (str): 输出Excel文件路径
    new_column_name (str): 新列的名称
    new_column_data (list): 新列的数据（列表形式）
    """
    try:
        # 1. 使用openpyxl加载工作簿，保留样式
        wb = load_workbook(input_file)
        ws = wb.active  # 获取活动工作表
        
        # 2. 确定新列的位置（在最后一列之后）
        last_column = ws.max_column
        new_column_letter = chr(65 + last_column)  # 65是'A'的ASCII码
        
        # 3. 设置新列的标题和样式
        header_cell = ws[f'{new_column_letter}1']
        header_cell.value = new_column_name
        
        # 复制上一列标题的样式到新列标题
        if last_column >= 1:
            prev_header_cell = ws[f'{chr(65 + last_column - 1)}1']
            
            # 复制字体样式
            try:
                header_cell.font = Font(
                    name=prev_header_cell.font.name,
                    size=prev_header_cell.font.size,
                    bold=prev_header_cell.font.bold,
                    italic=prev_header_cell.font.italic,
                    color=prev_header_cell.font.color
                )
            except Exception as e:
                print(f"复制字体样式时出错: {e}")
            
            # 修复：使用PatternFill替代Fill
            try:
                # 检查源单元格填充对象是否有fill_type属性
                if hasattr(prev_header_cell.fill, 'fill_type') and prev_header_cell.fill.fill_type is not None:
                    # 创建PatternFill对象
                    header_cell.fill = PatternFill(
                        fill_type=prev_header_cell.fill.fill_type,
                        fgColor=prev_header_cell.fill.fgColor.rgb if hasattr(prev_header_cell.fill, 'fgColor') and hasattr(prev_header_cell.fill.fgColor, 'rgb') else "00000000",
                        bgColor=prev_header_cell.fill.bgColor.rgb if hasattr(prev_header_cell.fill, 'bgColor') and hasattr(prev_header_cell.fill.bgColor, 'rgb') else "00000000"
                    )
            except Exception as e:
                print(f"复制填充样式时出错: {e}")
            
            # 复制对齐方式
            try:
                header_cell.alignment = Alignment(
                    horizontal=prev_header_cell.alignment.horizontal,
                    vertical=prev_header_cell.alignment.vertical
                )
            except Exception as e:
                print(f"复制对齐样式时出错: {e}")
        
        # 4. 添加新列的数据并复制样式
        # 确定数据范围（假设从第2行开始到数据的最后一行）
        max_row = ws.max_row
        
        # 如果提供的数据不足，用None填充
        if len(new_column_data) < max_row - 1:
            new_column_data.extend([None] * (max_row - 1 - len(new_column_data)))
        
        # 为每行添加数据并复制样式
        for i in range(2, max_row + 1):
            # 设置新列的值
            cell = ws[f'{new_column_letter}{i}']
            # 确保索引不越界
            data_index = i - 2
            if data_index < len(new_column_data):
                cell.value = new_column_data[data_index]
            
            # 复制上一列对应单元格的样式
            if last_column >= 1:
                prev_cell = ws[f'{chr(65 + last_column - 1)}{i}']
                
                # 复制字体样式
                try:
                    cell.font = Font(
                        name=prev_cell.font.name,
                        size=prev_cell.font.size,
                        bold=prev_cell.font.bold,
                        italic=prev_cell.font.italic,
                        color=prev_cell.font.color
                    )
                except Exception as e:
                    print(f"复制字体样式时出错(行{i}): {e}")
                
                # 修复：使用PatternFill替代Fill（这是您第87行出错的地方）
                try:
                    # 检查源单元格填充对象是否有fill_type属性
                    if hasattr(prev_cell.fill, 'fill_type') and prev_cell.fill.fill_type is not None:
                        # 创建PatternFill对象
                        cell.fill = PatternFill(
                            fill_type=prev_cell.fill.fill_type,
                            fgColor=prev_cell.fill.fgColor.rgb if hasattr(prev_cell.fill, 'fgColor') and hasattr(prev_cell.fill.fgColor, 'rgb') else "00000000",
                            bgColor=prev_cell.fill.bgColor.rgb if hasattr(prev_cell.fill, 'bgColor') and hasattr(prev_cell.fill.bgColor, 'rgb') else "00000000"
                        )
                except Exception as e:
                    print(f"复制填充样式时出错(行{i}): {e}")
                
                # 复制对齐方式
                try:
                    cell.alignment = Alignment(
                        horizontal=prev_cell.alignment.horizontal,
                        vertical=prev_cell.alignment.vertical
                    )
                except Exception as e:
                    print(f"复制对齐样式时出错(行{i}): {e}")
        
        # 5. 保存新的Excel文件
        wb.save(output_file)
        print(f"成功创建新文件：{output_file}")
        
    except Exception as e:
        print(f"处理Excel文件时出错：{e}")
        # 打印详细的错误信息以帮助调试
        import traceback
        traceback.print_exc()

# 修复：结合pandas读取数据并确定新列内容的函数
def process_excel_with_style(input_file, output_file, process_func):
    """
    读取Excel文件，使用pandas处理数据，然后添加计算列并保留样式
    
    参数:
    input_file (str): 输入Excel文件路径
    output_file (str): 输出Excel文件路径
    process_func (function): 处理数据的函数，接收DataFrame返回新列的数据和名称
    """
    try:
        # 1. 使用pandas读取数据（不包含样式）
        df = pd.read_excel(input_file)
        
        # 2. 使用提供的处理函数获取新列的数据和名称
        new_column_name, new_column_data = process_func(df)
        
        # 3. 调用前面的函数添加新列并保留样式
        add_column_with_style(input_file, output_file, new_column_name, new_column_data)
        
        return True
        
    except Exception as e:
        print(f"处理Excel文件时出错：{e}")
        # 打印详细的错误信息以帮助调试
        import traceback
        traceback.print_exc()
        return False

# 使用示例
if __name__ == "__main__":
    # 示例1：直接添加一列固定数据
    input_excel = os.path.join(current_dir, 'C-PA-马虎飞新商城退货表10.16.xlsx')
    output_excel = os.path.join(current_dir, 'C-PA-马虎飞新商城退货表10.16_新增列.xlsx')
    
    # 定义一个简单的处理函数，这里只是演示，您可以根据实际需求修改
    def sample_process(df):
        # 假设我们要添加一个"处理状态"列，初始值都为"待处理"
        new_column_name = "处理状态"
        new_column_data = ["待处理"] * len(df)
        return new_column_name, new_column_data
    
    # 调用函数处理Excel文件
    process_excel_with_style(input_excel, output_excel, sample_process)
     
    # 可以调用不同的处理函数
    # process_excel_with_style(input_excel, '退货表_带合计金额.xlsx', calculate_new_column)